﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Entidad;
using System.Configuration;
using System.Data.SqlClient;
using System.Data;

using System.Globalization;

namespace Datos
{
    public class DaPagos
    {
        /// <summary>
        /// Muestra los pagos
        /// </summary>
        /// <param name="codigo_proveedor">es el campo LIFNR</param>
        /// <param name="fecha">filtro Fecha</param>
        /// <param name="sociedad">filtro sociedad</param>
        /// <param name="numero_documento">filtro numero de documento</param>
        /// <param name="intranet">filtro si es intranet 1 = es intranet</param>
        /// <returns></returns>
        public List<EnResumenPago> listarResumen(string codigo_proveedor, DateTime fecha, DateTime fechaf,
            string sociedad, string numero_documento, string intranet, int pagina,int regxPag, ref int total, String nif)        
        {        
            string cadCon = ConfigurationManager.AppSettings["connString"].ToString();
            List<EnResumenPago> lstR = new List<EnResumenPago>();
            List<EnDetallePago> lstD = new List<EnDetallePago>();
            SqlDataReader dr1;
            SqlDataReader dr2;
            
            using (SqlConnection cn = new SqlConnection(cadCon))
            {
                cn.Open();
                using (SqlCommand cmd = new SqlCommand("proc_pagos_se", cn))        
                {
                    cmd.CommandType = System.Data.CommandType.StoredProcedure;
                    cmd.Parameters.Add("@codigo_proveedor", SqlDbType.NVarChar).Value = codigo_proveedor;
                    cmd.Parameters.Add("@fecha", SqlDbType.DateTime).Value = fecha.ToShortDateString();
                    cmd.Parameters.Add("@fechaf", SqlDbType.DateTime).Value = fechaf.ToShortDateString();
                    cmd.Parameters.Add("@sociedad", SqlDbType.NVarChar).Value = sociedad;
                    cmd.Parameters.Add("@numero_documento", SqlDbType.NVarChar).Value = numero_documento;
                    cmd.Parameters.Add("@intranet", SqlDbType.NVarChar).Value = intranet;
                    cmd.Parameters.Add("@pagina", SqlDbType.NVarChar).Value = pagina;
                    cmd.Parameters.Add("@registrosporpagina", SqlDbType.NVarChar).Value = regxPag;
                    cmd.Parameters.Add("@nif", SqlDbType.NVarChar).Value = nif;

                    dr1 = cmd.ExecuteReader();
                    while (dr1.Read())        
                    {
                        EnResumenPago objR = new EnResumenPago();
                        objR.codigo_sociedad = dr1[0].ToString();
                        objR.annio = dr1[1].ToString();
                        objR.numero_documento = dr1[2].ToString();
                        objR.posicion = Convert.ToInt16(dr1[3]);
                        DateTime fec = Convert.ToDateTime(dr1[4].ToString());
                        fec.ToString("d", CultureInfo.CreateSpecificCulture("es-ES"));
                        objR.fecha_pago = fec.ToString("d", CultureInfo.CreateSpecificCulture("es-ES"));//Convert.ToDateTime(dr1[3].ToString()).ToShortDateString();
                        objR.clase_documento = dr1[5].ToString();
                        objR.moneda = dr1[6].ToString();
                        objR.codigo_proveedor = dr1[7].ToString();
                        objR.importe_pago_documento = Convert.ToDecimal(dr1[8].ToString());
                        objR.numero_certificado_retencion = dr1[9].ToString();
                        objR.forma_pago = dr1[10].ToString();
                        objR.banco_receptor = dr1[11].ToString().Trim().Equals("ND") ? "NO DISPONIBLE" : dr1[11].ToString().Trim();
                        objR.banco_emisor = dr1[12].ToString();
                        objR.cuenta_bancaria_receptor = dr1[13].ToString().Trim().Equals("ND") ? "INFORMACIÓN NO DISPONIBLE" : dr1[13].ToString().Trim();
                        objR.tipo_cambio = Convert.ToDecimal(dr1[14]);
                        objR.descripcion_sociedad = dr1[15].ToString();
                        objR.cant_doc = Convert.ToInt16(dr1[16]);
                        total = Convert.ToInt32(dr1[19]);
                        lstR.Add(objR);
                    }
                    dr1.Close();

                    
                }

                using (SqlCommand cmd = new SqlCommand("proc_facturas_se", cn))
                {
                    cmd.CommandType = System.Data.CommandType.StoredProcedure;
                    cmd.Parameters.Add("@codigo_proveedor", SqlDbType.NVarChar).Value = codigo_proveedor;
                    cmd.Parameters.Add("@fecha", SqlDbType.DateTime).Value = fecha.ToShortDateString();
                    cmd.Parameters.Add("@sociedad", SqlDbType.NVarChar).Value = sociedad;
                    cmd.Parameters.Add("@numero_documento", SqlDbType.NVarChar).Value = numero_documento;
                    cmd.Parameters.Add("@intranet", SqlDbType.NVarChar).Value = intranet;

                    dr2 = cmd.ExecuteReader();
                    while (dr2.Read())
                    {
                        EnDetallePago objD = new EnDetallePago();
                        objD.codigo_sociedad = dr2[0].ToString();
                        objD.annio = dr2[1].ToString();
                        objD.numero_documento_padre = dr2[2].ToString();
                        objD.posicion = Convert.ToInt16(dr2[3]);
                        objD.numero_documento = dr2[4].ToString();
                        objD.codigo_tipo_documento = dr2[5].ToString();
                        objD.descripcion_tipo_documento = dr2[6].ToString();                        
                        objD.referencia = dr2[7].ToString();
                        objD.numero_orden_compra = dr2[8].ToString();
                        objD.moneda = dr2[9].ToString();
                        objD.importe_pago_moneda_documento = Convert.ToDecimal(dr2[10].ToString());
                        objD.constancia_detraccion = dr2[11].ToString();
                        lstD.Add(objD);
                    }
                    dr2.Close();
                }
            }
            
            //ahora uno ambas listas según el código
            if (lstR != null && lstR.Count > 0)
            {
                foreach (EnResumenPago item1 in lstR)
                {
                    List<EnDetallePago> lstDP = lstD.FindAll(x => (x.numero_documento_padre == item1.numero_documento)
                                                            && (x.annio == item1.annio) 
                                                            && (x.codigo_sociedad == item1.codigo_sociedad)
                                                            && (x.posicion == item1.posicion));
                                                        
                    if (lstDP != null && lstDP.Count > 0)
                    {
                        item1.detalle_pago = lstDP;
                    }
                }
            }

            return lstR;
        }

        public List<EnDetraccion> selecccionDetraccion(string sociedad, string annio, string numero_documento, 
            string numero_constancia, int posicion)
        {
            string cadCon = ConfigurationManager.AppSettings["connString"].ToString();
            List<EnDetraccion> lstD = new List<EnDetraccion>();
            SqlDataReader dr3; 
            using (SqlConnection cn = new SqlConnection(cadCon))
            {
                cn.Open();
                using (SqlCommand cmd = new SqlCommand("proc_detracciones_se", cn))
                {
                    cmd.CommandType = System.Data.CommandType.StoredProcedure;
                    cmd.Parameters.Add("@sociedad", SqlDbType.NVarChar).Value = sociedad;
                    cmd.Parameters.Add("@annio", SqlDbType.NVarChar).Value = annio;
                    cmd.Parameters.Add("@numero_documento", SqlDbType.NVarChar).Value = numero_documento;
                    cmd.Parameters.Add("@numero_constancia", SqlDbType.NVarChar).Value = numero_constancia;
                    cmd.Parameters.Add("@posicion", SqlDbType.Int).Value = posicion;
                    CultureInfo ci =  new CultureInfo("de-DE");
                    dr3 = cmd.ExecuteReader();
                    while (dr3.Read())
                    {
                        EnDetraccion objDetr = new EnDetraccion();
                        objDetr.constancia_detraccion = dr3[0].ToString();
                        objDetr.codigo_proveedor = dr3[1].ToString();
                        objDetr.descripcion_proveedor = dr3[2].ToString();
                        objDetr.codigo_sociedad = dr3[3].ToString();
                        objDetr.descripcion_sociedad = dr3[4].ToString();
                        double monto = double.Parse(dr3[5].ToString());// floatingVal.ToString("N", ci);
                        objDetr.importe_retencion_moneda_documento = "S/." + monto.ToString("N2", CultureInfo.InvariantCulture);
                        objDetr.fecha = dr3[6].ToString();
                        objDetr.periodo_tributario = dr3[7].ToString();
                        objDetr.documento_proveedor = dr3[8].ToString();
                        objDetr.ruc_sociedad = dr3[9].ToString();
                        lstD.Add(objDetr);
                    }
                    dr3.Close();
                }
            }

            return lstD;
        }

        public List<EnRetencion> selecccionRetenciones(string sociedad, string annio, string numero_documento, 
                        string numero_certificado_retencion, int posicion)
        {
            string cadCon = ConfigurationManager.AppSettings["connString"].ToString();
            List<EnRetencion> lstD = new List<EnRetencion>();
            SqlDataReader dr3;
            using (SqlConnection cn = new SqlConnection(cadCon))
            {
                cn.Open();
                using (SqlCommand cmd = new SqlCommand("proc_retencion_se", cn))
                {
                    cmd.CommandType = System.Data.CommandType.StoredProcedure;
                    cmd.Parameters.Add("@sociedad", SqlDbType.NVarChar).Value = sociedad;
                    cmd.Parameters.Add("@annio", SqlDbType.NVarChar).Value = annio;
                    cmd.Parameters.Add("@numero_documento_padre", SqlDbType.NVarChar).Value = numero_documento;
                    cmd.Parameters.Add("@numero_certificado_retencion", SqlDbType.NVarChar).Value = numero_certificado_retencion;
                    cmd.Parameters.Add("@posicion", SqlDbType.Int).Value = posicion;

                    dr3 = cmd.ExecuteReader();
                    while (dr3.Read())
                    {
                        EnRetencion objDet = new EnRetencion();
                        objDet.codigo_sociedad = dr3[0].ToString();
                        objDet.annio = dr3[1].ToString();
                        objDet.numero_documento_padre = dr3[2].ToString();
                        objDet.descripcion_sociedad = dr3[3].ToString();
                        objDet.direccion_sociedad = dr3[4].ToString();
                        objDet.telefono_sociedad = dr3[5].ToString();
                        objDet.fax_sociedad = dr3[6].ToString();
                        objDet.ruc_sociedad = dr3[7].ToString();
                        objDet.numero_autorizacion_impresion = dr3[8].ToString();

                        DateTime fec = Convert.ToDateTime(dr3[9].ToString());
                        fec.ToString("d", CultureInfo.CreateSpecificCulture("es-ES"));
                        objDet.fecha_contabilizacion = fec.ToString("d", CultureInfo.CreateSpecificCulture("es-ES"));

                        //objDet.fecha_contabilizacion = Convert.ToDateTime(dr3[9].ToString()).ToShortDateString();
                        objDet.numero_certificado_retencion = dr3[10].ToString();
                        objDet.codigo_proveedor = dr3[11].ToString();
                        objDet.descripcion_proveedor = dr3[12].ToString();
                        objDet.direccion_proveedor = dr3[13].ToString();
                        objDet.tipo = dr3[14].ToString();
                        objDet.serie = dr3[15].ToString();
                        objDet.numero = dr3[16].ToString();
                        DateTime fec1 = Convert.ToDateTime(dr3[17].ToString());
                        fec1.ToString("d", CultureInfo.CreateSpecificCulture("es-ES"));
                        objDet.fecha_emision = fec1.ToString("d", CultureInfo.CreateSpecificCulture("es-ES"));
                        //objDet.fecha_emision = Convert.ToDateTime(dr3[17].ToString()).ToShortDateString();

                        objDet.importe_pago_usd = Convert.ToDecimal(dr3[18]);
                        objDet.importe_retenido_usd = Convert.ToDecimal(dr3[19]);
                        objDet.importe_pago_pen = Convert.ToDecimal(dr3[20]);
                        objDet.importe_retenido_pen = Convert.ToDecimal(dr3[21]);
                        objDet.tipo_cambio_resumen = Convert.ToDecimal(dr3[22]);
                        objDet.importe_letra = dr3[23].ToString();
                        objDet.documento_proveedor = dr3[24].ToString();
                        lstD.Add(objDet);
                    }
                    dr3.Close();
                }
            }

            //solo para rellenar
            if (lstD != null && lstD.Count <= 22)
            {
                EnRetencion objD = new EnRetencion();
                for (int i = lstD.Count ; i <= 22; i++)
                {
                    objD.fecha_emision = "";
                    objD.importe_pago_usd = 0;
                    objD.importe_retenido_usd = 0;
                    objD.importe_pago_pen = 0;
                    objD.importe_retenido_pen = 0;
                    lstD.Add(objD);
                }
            }
            else if (lstD != null && lstD.Count <= 45)
            {
                EnRetencion objD = new EnRetencion();
                for (int i = lstD.Count; i <= 45; i++)
                {
                    objD.fecha_emision = "";
                    objD.importe_pago_usd = 0;
                    objD.importe_retenido_usd = 0;
                    objD.importe_pago_pen = 0;
                    objD.importe_retenido_pen = 0;
                    lstD.Add(objD);
                }
            }
            else if (lstD != null && lstD.Count <= 67)
            {
                EnRetencion objD = new EnRetencion();
                for (int i = lstD.Count; i <= 67; i++)
                {
                    objD.fecha_emision = "";
                    objD.importe_pago_usd = 0;
                    objD.importe_retenido_usd = 0;
                    objD.importe_pago_pen = 0;
                    objD.importe_retenido_pen = 0;
                    lstD.Add(objD);
                }
            }

            return lstD;
        }
    }
}
